package study.activiti.k_personalTask;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

/**  
 * @Name: PersonalTaskTest
 * @Description: 个人任务测试类
 * @Author: 李超
 * @Create Date: 2016-12-15
 */
public class PersonalTaskTest {
	
	//流程引擎
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine() ;
	
	//1、部署流程定义
	@Test
	public void deploymentProcessDefinition() {
		//获取流程资源输入流
		InputStream inputStreamBpmn = this.getClass().getResourceAsStream("personalTask.bpmn") ;
		InputStream inputStreamPng = this.getClass().getResourceAsStream("personalTask.png") ;
		//部署流程定义
		Deployment deployment = processEngine.getRepositoryService()
					 .createDeployment()
					 .name("个人任务")
					 .addInputStream("personalTask.bpmn", inputStreamBpmn)
					 .addInputStream("personalTask.png", inputStreamPng)
					 .deploy() ; //完成部署
		System.out.println("部署【个人任务】流程定义成功");
		System.out.println("部署id:" + deployment.getId());
		System.out.println("部署名称:" + deployment.getName());
		System.out.println("部署时间:" + deployment.getDeploymentTime());
		System.out.println("#########################################");
	}
	
	//2、启动流程实例
	@Test
	public void startProcessInstance() {
		//流程定义的key
		String processDefinitionKey = "personalTask" ;
		//设置流程变量：指定任务办理人
		Map<String, Object> variables = new HashMap<String, Object>() ;
		variables.put("userID", "李小四") ;
		//根据流程定义的key启动流程实例
		//ProcessInstance processInstance = processEngine.getRuntimeService()
		//			 .startProcessInstanceByKey(processDefinitionKey) ;
		//启动流程实例同时，设置流程变量，来指定流程中用户任务的办理人
		ProcessInstance processInstance = processEngine.getRuntimeService()
					 .startProcessInstanceByKey(processDefinitionKey, variables) ;
		System.out.println("启动【个人任务】流程实例");
		System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
		System.out.println("流程实例id:" + processInstance.getProcessInstanceId());
	}
	
	//3、查询个人任务
	@Test
	public void queryMyPersonalTask() {
		//任务办理人
		String assignee = "李小四" ;
		//查询指定办理人的个人任务
		List<Task> list = processEngine.getTaskService()
					 .createTaskQuery()
					 .taskAssignee(assignee) 
					 .orderByTaskCreateTime().asc()
					 .list() ;
		System.out.println("查询指定办理人的个人任务");
		if(list != null && list.size() > 0) {
			for (Task task : list) {
				System.out.println("任务id:" + task.getId());
				System.out.println("任务名称:" + task.getName());
				System.out.println("任务办理人:" + task.getAssignee());
				System.out.println("任务创建时间:" + task.getCreateTime());
				System.out.println("执行对象id:" + task.getExecutionId());
				System.out.println("###############################");
			}
		}
	}
	
	/**
	 * 4、办理个人任务
	 * 		方式一：直接指定办理人
	 * 			说明：这样分配任务的办理人不够灵活，因为项目开发中任务的办理人不要放置XML文件中。
	 * 		方式二：使用流程变量指定任务办理人
	 * 			说明：启动流程实例的同时，设置流程变量，指定任务办理人
	 * 	        	在开发中，可以在页面中指定下一个任务的办理人，通过流程变量设置下一个任务的办理
	 * 		
	 */
	@Test
	public void completePersonalTaskByAssignee() {
		//任务id
		String tashId = "157505" ;
		//办理个人任务
		processEngine.getTaskService().complete(tashId) ;
		System.out.println("任务办理完成");
	}
	

}














